home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / NOTEBOOK.PAK / NB.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  9KB  |  317 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (c) 1995, 1995 by Borland International, All Rights Reserved
  4. //----------------------------------------------------------------------------
  5. #include <owl/pch.h>
  6. #include <owl/applicat.h>
  7. #include <owl/mdi.h>
  8. #include <owl/decmdifr.h>
  9. #include <owl/statusba.h>
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12.  
  13. #include "utils.h"              // debugging support
  14. #include "notebook.h"
  15. #include "nb.h"
  16. //----------------------------------------------------------------------------
  17. DEFINE_RESPONSE_TABLE1(TNBClient, TMDIClient)
  18.   EV_COMMAND_AND_ID(MID_TOP, NewWin),
  19.   EV_COMMAND_AND_ID(MID_RIGHT, NewWin),
  20.   EV_COMMAND_AND_ID(MID_BOTTOM, NewWin),
  21.   EV_COMMAND_AND_ID(MID_LEFT, NewWin),
  22.   EV_COMMAND(MID_EXIT, CmdExit),
  23.   EV_COMMAND(MID_CASCADE, CmdCascade),
  24.   EV_COMMAND(MID_TILEH, CmdTileH),
  25.   EV_COMMAND(MID_TILEV, CmdTileV),
  26.   EV_COMMAND(MID_ARRANGE, CmdArrange),
  27. END_RESPONSE_TABLE;
  28. //----------------------------------------------------------------------------
  29. DEFINE_RESPONSE_TABLE2(TMyNotebook, TNotebook, TMDIChild)
  30.   EV_WM_SIZE,
  31.   EV_WM_HSCROLL,
  32.   EV_WM_VSCROLL,
  33. END_RESPONSE_TABLE;
  34. //----------------------------------------------------------------------------
  35. TTestApp::TTestApp()
  36.     : TApplication("Notebook Test App")
  37. {
  38. }
  39. //----------------------------------------------------------------------------
  40. TMyNotebook::TMyNotebook(TMDIClient& parent, const char far* title, int tabloc)
  41.     : TMDIChild(parent, title), TNotebook(tabloc)
  42. {
  43.   Attr.Style |= (WS_HSCROLL | WS_VSCROLL);              // for testing...
  44.   sprintf(textbuff, "Window %d", 0);
  45.   SetTabCnt(2000, 0, 0);
  46.  
  47.   maxhs = 100;          // match initial scroll bars
  48.   maxvs = 100;          // match initial scroll bars
  49.   curhs = 0;
  50.   curvs = 0;
  51.   myresizing = FALSE;
  52.   maxxval = 350;
  53.   maxyval = 250;
  54. }
  55. //----------------------------------------------------------------------------
  56. void TMyNotebook::ActivateTab(int tabnum)
  57. {
  58.   TNotebook::ActivateTab(tabnum);
  59.  
  60.   sprintf(textbuff, "Window %d", tabnum);
  61.   ::InvalidateRect(HWindow, NULL, TRUE);
  62. }
  63. //----------------------------------------------------------------------------
  64. void TTestApp::InitMainWindow()
  65. {
  66.   EnableCtl3d(TRUE);
  67.  
  68.   TDecoratedMDIFrame *frame;
  69.  
  70.   Client = new TNBClient;
  71.   frame = new TDecoratedMDIFrame("Notebook Test App", "mainmenu",
  72.     *Client, TRUE);
  73.   frame->SetIcon(this, "nb");
  74.   MainWindow = frame;
  75.  
  76.   TStatusBar *statusbar = new TStatusBar(0, TGadget::Recessed,
  77.     TStatusBar::CapsLock | TStatusBar::NumLock | TStatusBar::Overtype);
  78.  
  79.   frame->Insert(*statusbar, TDecoratedFrame::Bottom);
  80. }
  81. //----------------------------------------------------------------------------
  82. void TTestApp::InitInstance()
  83. {
  84.   TApplication::InitInstance();
  85.  
  86.   Client->NewWin(MID_LEFT);
  87. }
  88. //----------------------------------------------------------------------------
  89. int OwlMain(int /*argc*/, char* /*argv*/ [])
  90. {
  91. #if defined(__WIN32__)
  92.   if (!TSystem::Has3dUI()) {
  93.     ::MessageBox(0, "Must be run on Windows 4.0 or greater.", "OWL Examples", MB_OK);
  94.     return 0;
  95.   }
  96. #endif
  97.   return(TTestApp().Run());
  98. }
  99. //----------------------------------------------------------------------------
  100. void TMyNotebook::Paint(TDC& dc, bool erase, TRect& /*rect*/)
  101. {
  102.   dc.SetWindowOrg(TPoint(curhs, curvs));
  103.  
  104.   if (erase) {
  105.     RECT myrect = GetClientRect();
  106.     FillRect(dc, &myrect, (HBRUSH) GetStockObject(WHITE_BRUSH));
  107.   }
  108.  
  109.   TBrush bluebrush(TColor::LtBlue);
  110.   TBrush greenbrush(TColor::LtGreen);
  111.   TBrush redbrush(TColor::LtRed);
  112.  
  113.   dc.FrameRect(0, 0, 350, 250, redbrush);
  114.   dc.FrameRect(50, 50, 300, 200, greenbrush);
  115.   dc.FrameRect(100, 100, 250, 150, bluebrush);
  116.  
  117.   dc.DrawText(textbuff, -1, TRect(100, 100, 250, 150),
  118.     DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  119. }
  120. //----------------------------------------------------------------------------
  121. void TMyNotebook::EvSize(UINT sizeType, TSize& newsize)
  122. {
  123.   defer_ncpaint = 1;            // don't paint nc until futher notice...
  124.                         // otherwise base EvSize() will paint
  125.   TNotebook::EvSize(sizeType, newsize);
  126.  
  127.   if (! myresizing) {
  128.     int cwidth = newsize.cx;
  129.     int cheight = newsize.cy;
  130.     int hsize = GetSystemMetrics(SM_CYHSCROLL) - 1;
  131.     int vsize = GetSystemMetrics(SM_CXVSCROLL) - 1;
  132.     int prev_maxvs = maxvs;
  133.     int prev_maxhs = maxhs;
  134.  
  135.     if ((maxhs) && (tabloc != LOC_BOTTOM))  // add size for horz sb
  136.             cheight += hsize;
  137.     if ((maxvs) && (tabloc != LOC_RIGHT))   // add size for vert sb
  138.             cwidth += vsize;
  139.  
  140.     // set "maxhs" and "maxvs" to max amt to be scrolled in each dir
  141.     if (cwidth < maxxval) {
  142.             maxhs = maxxval - cwidth;
  143.             if (tabloc != LOC_BOTTOM)
  144.               cheight -= hsize;
  145.     } else
  146.             maxhs = 0;
  147.  
  148.     if (cheight < maxyval){
  149.             maxvs = maxyval - cheight;
  150.             if (tabloc != LOC_RIGHT)
  151.               cwidth -= vsize;
  152.     } else
  153.             maxvs = 0;
  154.  
  155.     // if vscroll being used, recalc maxhs
  156.     if ((maxvs) && (cwidth < maxxval))
  157.             maxhs = maxxval - cwidth;
  158.  
  159.     myresizing = TRUE;          // avoid recursion
  160.     if (maxhs != prev_maxhs){
  161.       curhs = min(curhs, maxhs);
  162.       SetScrollRange(SB_HORZ, 0, maxhs, FALSE);
  163.       SetScrollPos(SB_HORZ, curhs, TRUE);
  164.     }
  165.  
  166.     if (maxvs != prev_maxvs){
  167.         curvs = min(curvs, maxvs);
  168.         SetScrollRange(SB_VERT, 0, maxvs, FALSE);
  169.         SetScrollPos(SB_VERT, curvs, TRUE);
  170.     }
  171.     ForceResize(TRUE);
  172.     myresizing = FALSE;
  173.     ::InvalidateRect(HWindow, NULL, TRUE);
  174.   }
  175. }
  176. //----------------------------------------------------------------------------
  177. void TMyNotebook::EvHScroll(UINT scrollCode, UINT thumbPos, HWND /*hWndCtl*/)
  178. {
  179.   int delta, newhs;
  180.   TRect crect = GetClientRect();
  181.   int cwidth = crect.Width();
  182.  
  183.   switch (scrollCode){
  184.     case SB_LINELEFT:
  185.             delta = -cwidth/10;
  186.             break;
  187.  
  188.     case SB_LINERIGHT:
  189.             delta = cwidth/10;
  190.             break;
  191.  
  192.     case SB_PAGELEFT:
  193.             delta = -cwidth;
  194.             break;
  195.  
  196.     case SB_PAGERIGHT:
  197.             delta = cwidth;
  198.             break;
  199.  
  200.     case SB_THUMBPOSITION:
  201.             delta = thumbPos-curhs;
  202.             break;
  203.  
  204.     default:
  205.             delta = 0;
  206.             break;
  207.   }
  208.  
  209.   newhs = min(max(0, curhs + delta), maxhs);
  210.   if (newhs != curhs) {
  211.     curhs = newhs;
  212.     SetScrollPos(SB_HORZ, curhs, TRUE);
  213.     ::InvalidateRect(HWindow, NULL, TRUE);
  214.     UpdateWindow();
  215.   }
  216. }
  217. //----------------------------------------------------------------------------
  218. void TMyNotebook::EvVScroll(UINT scrollCode, UINT thumbPos, HWND /*hWndCtl*/)
  219. {
  220.   int newvs, delta;
  221.   TRect crect = GetClientRect();
  222.   int cheight = crect.Height();
  223.  
  224.   switch (scrollCode) {
  225.     case SB_LINEUP:
  226.             delta = -cheight/10;
  227.             break;
  228.  
  229.     case SB_LINEDOWN:
  230.             delta = cheight/10;
  231.             break;
  232.  
  233.     case SB_PAGEUP:
  234.             delta = -cheight;
  235.             break;
  236.  
  237.     case SB_PAGEDOWN:
  238.             delta = cheight;
  239.             break;
  240.  
  241.     case SB_THUMBPOSITION:
  242.             delta = thumbPos-curvs;
  243.             break;
  244.  
  245.     default:
  246.             delta = 0;
  247.             break;
  248.   }
  249.  
  250.   newvs = min(max(0, curvs + delta), maxvs);
  251.   if (newvs != curvs) {
  252.     curvs = newvs;
  253.     SetScrollPos(SB_VERT, curvs, TRUE);
  254.     ::InvalidateRect(HWindow, NULL, TRUE);
  255.     UpdateWindow();
  256.   }
  257. }
  258. //----------------------------------------------------------------------------
  259. TNBClient::TNBClient(TModule *module)
  260.     : TMDIClient(module)
  261. {
  262. }
  263. //----------------------------------------------------------------------------
  264. void TNBClient::NewWin(WPARAM cmd)
  265. {
  266.   int tabloc;
  267.   TMyNotebook *nb;
  268.   char name[30];
  269.  
  270.   tabloc = cmd-MID_TOP;
  271.   switch (tabloc) {
  272.     case LOC_BOTTOM:
  273.             strcpy(name, "Tabs on Bottom");
  274.             break;
  275.     case LOC_TOP:
  276.             strcpy(name, "Tabs on Top");
  277.             break;
  278.     case LOC_LEFT:
  279.             strcpy(name, "Tabs on Left");
  280.             break;
  281.     case LOC_RIGHT:
  282.             strcpy(name, "Tabs on Right");
  283.             break;
  284.   }
  285.  
  286.   nb = new TMyNotebook(*this, name, tabloc);
  287.   nb->SetIcon(GetApplication(), "notebook");
  288.  
  289.   nb->Create();
  290. }
  291. //----------------------------------------------------------------------------
  292. void TNBClient::CmdCascade()
  293. {
  294.   CascadeChildren();
  295. }
  296. //----------------------------------------------------------------------------
  297. void TNBClient::CmdTileH()
  298. {
  299.   TileChildren(MDITILE_HORIZONTAL);
  300. }
  301. //----------------------------------------------------------------------------
  302. void TNBClient::CmdTileV()
  303. {
  304.   TileChildren(MDITILE_VERTICAL);
  305. }
  306. //----------------------------------------------------------------------------
  307. void TNBClient::CmdArrange()
  308. {
  309.   ArrangeIcons();
  310. }
  311. //----------------------------------------------------------------------------
  312. void TNBClient::CmdExit()
  313. {
  314.   PostQuitMessage(0);
  315. }
  316. //----------------------------------------------------------------------------
  317.